Node.js clusterのmasterプロセスにも--max-old-space-sizeを指定する
CLUSTER_WORKER_NODE_OPTIONSだけでなく、masterプロセスにもNODE_OPTIONSで--max-old-space-sizeを付けたいshokai.icon
heroku app全体には付けない
経緯
HerokuでCluster modeのnode.jsプロセスを起動するとそれぞれがメモリを手加減なしに使おうとするので--max-old-space-sizeの指定が必須
環境変数CLUSTER_WORKER_NODE_OPTIONSに--max-old-space-size=512を設定した後の経過観察
dead.icon NewRelic 12が原因でCosenseのメモリ使用量が増えてるわけではなかった
masterのnodeコマンドに対して付けなければならない
どこで付ける?
Herokuの環境変数
これはダメ。batch処理などにも影響してしまう
Procfileにweb: NODE_OPTIONS=--max-old-space-size=150 npm startと書く
npm run start:herokuを作り、そっちを使うようProcfileで指定する
Procfileにweb: bash start-web.shと書く
start-web.shの中で環境変数SERVER_NODE_OPTIONSをチェック
あればNODE_OPTIONSにセットしてから
npm startする
npm startはnode run-server.jsを呼び出す。これでwebプロセスだけにNODE_OPTIONSが付いてサーバー起動
逆に、Procfileはweb: npm startのままで
npm startからnode run-server.jsではなく、bash prepare-server.shを起動
prepare-server.shは
環境変数SERVER_NODE_OPTIONSがあれば、NODE_OPTIONSを上書きする
NODE_ENVを判別して、node run-server.jsとtsx watch run-server.jsを使い分けてサーバー起動
全ての環境でnpm startという共通コマンドでサーバー起動できる
ローカル開発環境のdocker-compose.yml
productionのProcfile
オンプレ版のDockerfile
smoke testのtest/release-smoke-test.sh
こっちを採用したshokai.icon
done.icon 環境変数SERVER_NODE_OPTIONSでserver processだけにNODE_OPTIONSを設定する #7926
cluster masterとworkerそれぞれにNODE_OPTIONSを設定した様子
https://scrapbox.io/files/692577414b2f8802dfbfd656.png
code:.env
WEB_CONCURRENCY=2
SERVER_NODE_OPTIONS=--max-old-space-size=200
CLUSTER_WORKER_NODE_OPTIONS=--max-old-space-size=400
single master modeの場合
https://scrapbox.io/files/69257744bb35d7263448807d.png
空文字列での上書きもできる
https://gyazo.com/6d01d6d8fd7847eb3bdb65657cb8babc
環境変数はサーバー全体→ユーザー→コマンド実行時と設定できるタイミングが複数あり、後出しで上書きでき、空文字列での上書きも可能
そのルールに従う
リリース後の観察
環境変数SERVER_NODE_OPTIONSに--max-old-space-size=100を設定した後の経過観察
NODE_OPTIONS_FOR_SERVERとNODE_OPTIONS_FOR_CLUSTER_WORKERにリネームした方がいいかもしれないshokai.icon
SERVER_NODE_OPTIONSとCLUSTER_WORKER_NODE_OPTIONSだと、アルファベット順でソートした時に遠すぎる
同じカテゴリの環境変数である事は、前方一致で示した方がいい
まあいいかshokai.icon
それ言い出すとSAML_IDP_ENTRY_POINTとENABLE_PROJECT_SAML_AUTHとか、いくらでも反例が出てくる